using System.Collections.Generic;

namespace SIP.PN.Modelo.Entidades
{
    public class TipoDeProyecto
    {
        #region Propiedades Privadas

        private string codigo;
        private string nombre;
        private IList<Concepto> conceptos;

        #endregion

        #region Propiedades Publicas

        public virtual string Codigo
        {
            get { return codigo; }
            set { codigo = value; }
        }

        public virtual string Nombre
        {
            get { return nombre; }
            set { nombre = value; }
        }

        public virtual IList<Concepto> Conceptos
        {
            get { return conceptos; }
            set { conceptos = value; }
        }

        #endregion

        #region Concepto

        public virtual Concepto AgregarConcepto(string xcodigo, string tipo, string xnombre, string xdescripcion)
        {
            Concepto c;
            switch(tipo)
            {
                case "TAREA":
                    c = new ConceptoTarea();
                    break;
                case "OPERARIO":
                    c = new ConceptoOperario();
                    break;
                default:
                    c = new ConceptoCompartido();
                    break;
            }
            c.Codigo = xcodigo;
            c.TipoDeProyecto = this;
            c.Nombre = xnombre;
            c.Descripcion = xdescripcion;
            conceptos.Add(c);
            return c;
        }

        public virtual Concepto ObtenerConcepto(string xcodigo)
        {
            foreach (Concepto item in conceptos)
            {
                if (item.Codigo.Equals(xcodigo))
                    return item;
            }
            return null;
        }

        public virtual void EliminarConcepto(string xcodigo)
        {
            Concepto item = ObtenerConcepto(xcodigo);
            if (item != null)
            {
                conceptos.Remove(item);
            }
        }

        public virtual IList<Concepto> ObtenerConceptosTarea()
        {
            IList<Concepto> r = new List<Concepto>();
            foreach (Concepto concepto in conceptos)
            {
                if (concepto.EsDeTarea())
                    r.Add(concepto);
            }
            return r;
        }

        public virtual IList<Concepto> ObtenerConceptosOperario()
        {
            IList<Concepto> r = new List<Concepto>();
            foreach (Concepto concepto in conceptos)
            {
                if (concepto.EsDeOperario())
                    r.Add(concepto);
            }
            return r;
        }

        #endregion

        #region Metodos Sobreescritos

        public override bool Equals(object obj)
        {
            TipoDeProyecto otro = obj as TipoDeProyecto;
            if (otro == null) return false;
            return Codigo.Equals(otro.Codigo);
        }

        public override int GetHashCode()
        {
            return string.Format("{0}-{1}", GetType(), ToString()).GetHashCode();
        }

        public override string ToString()
        {
            return Codigo;
        }

        #endregion
    }
}
